Baraj, Sibiu, august 1996, Ziua 2
Problema 1 (Intr-o lume mafiota - Emanuela Mateescu)

Intr-o nu stiu care tara, in urma unor lupte seculare care au durat 30 de ani, 
Mafia si-a impartit zonele de influenta. Fiecare sef mafiot si-a stabilit un 
sediu si a cucerit o zona de influenta, de forma circulara, cu centrul in sediul 
personal. In functie de zonele de influenta cucerite in lumea mafiota s-a 
stabilit o ierarhie: daca zona de influenta a lui X este inclusa in zona de 
influenta a lui Y, atunci X este subordonat al lui Y. Cum in lumea mafiota 
singurele relatii posibile (fara conflicte) sunt cele de subordonare sau de 
independenta relativa, relatiile de colaborare fiind excluse, pentru ca pacea sa 
fie stabila trebuie ca zonele de influenta intre care nu exista relatie de 
incluziune sa fie disjuncte. 
Verificati daca pacea este stabila si daca da, afisati numarul de clanuri 
relativ independente si structura organizatorica a fiecarui clan in parte, 
precizand care este Marele Sef de Clan, subordonatii directi ai Marelui Sef, 
subordonatii directi ai subordonatilor directi etc. Evident, Marele Sef de Clan 
este singurul care nu are superior ierarhic, iar clanul este format din toate 
persoanele subordonate Marelui Sef.
Pe teritoriul tarii exista un reper strategic, intr-un punct de coordonate 
intregi. Daca pacea a fost stabila, verificati daca reperul strategic este un 
punct neutru (liber de orice influenta), iar daca nu, afisati clanurile care ar 
putea cuceri reperul strategic, prin marirea razei de influenta, fara a intra 
in conflict cu alte clanuri.
Restric]ii de intrare / iesire:
Fisierul de intrare se numeste mafia.in si contine mai multe seturi de date de 
test, separate printr-o linie ce contine in prima pozi]ie un  '*'.
Fiecare set de date de test are urmatoarea structura:
r1 x1 y1        // raza de influenta, abscisa si respectiv ordonata sediului 
		primului mafiot
..
rk xk yk        // raza de influenta, abscisa si respectiv ordonata sediului 
		mafiotului k
x y                //coordonatele reperului strategic

Fisierul de iesire se numeste mafia.out si va contine pentru fiecare set 
de date de test:
Testul nr.  ..                   //numarul testului
Pacea [nu] este stabila.
Numarul de clanuri ..            //numai (n cazul in care pacea este stabila)
Clanul 1:
i11                              // Seful clanului 1
i21 i22 ..                      // subordonatii directi ai sefului
i31 i32 ..                      //subordonatii directi ai mafiotilor i21,i22,..
....
Clanul 2:
...
Reperul strategic [nu] este neutru.
s1 s2 ...sh                     // Sefii clanurilor ce pot cuceri reperul 
				strategic, daca acesta este neutru
Observatii
     1. Razele zonelor de influenta, coordonatele sediilor sefilor de clan 
si coordonatele reperului strategic sunt numere intregi din intervalul [0,32000].
     2. Clanurile sunt numerotate in ordinea crescatoare a indicilor sefilor 
de clan.
De exemplu, pentru mafia.in:
5 6 6 
2 12 6
1 100
*
30 30 30
5 15 45
15 30 45
5 25 50 
5 35 40
10 80 10
80 5
     mafia.out va fi:
Testul nr. 1
Pacea nu este stabila.
Testul nr. 2
Pacea este stabila.
Numarul de clanuri: 2
Clanul 1:
1
2 3
4 5
Clanul 2:
6
Reperul strategic nu este neutru.
========================================
Solutie (autor)
- un algoritm de tip "sweeping"
- Ordonam crescator abscisele extremitatilor discurilor ce reprezinta zonele de 
influenta.
Traversam (maturam) multimea extremitatilor discurilor de la stanga la dreapta:
Daca x este extremitate initiala pentru un disc d:
Inseram d in SLS (sweep line status). In SLS retinem discurile in ordinea 
crescatoare a ordonatelor centrelor lor.
Daca d intersecteaza unul din eventualii sai vecini: stop, pacea nu este stabila.
Altfel, daca d este inclus in unul din eventualii sai vecini, retinem d ca 
subordonat direct al acestuia, altfel comparam succesiv d cu superiorii directi 
ai vecinilor, etc pana cand determinam o relatie de subordonare directa sau 
pana cand am ajuns in radacina arborilor ce reprezinta clanurile (disjuncte) 
corespunzatoare vecinilor lui d, caz in care d va constitui radacina unui nou 
arbore (clan).
Daca x este extremitate finala a unui disc d:
Daca eventualii sai vecini se intersecteaza: stop, pacea nu este stabila.
Daca eventualii sai vecini se includ, atunci unificam arborii corespunzatori 
clanurilor lor.
Sterge d din SLS.
Parcurge pe niveluri arborii corespunzatori clanurilor.
Reprezentarea informatiilor:
Pentru fiecare disc (zona de influenta) vom retine intr-o matrice cu 3 linii, 
raza si coordonatele centrului.
Vom retine intr-o matrice cu doua linii abscisele extremitatilor discurilor 
(x-r, x+r), ordonate crescator, cu indicele discului corespunzator.
Multimea clanurilor va fi o padure, reprezentata ca un vector sau o lista de 
pointeri la radacinile arborilor ce reprezinta clanurile.
Un clan va fi reprezentat ca un arbore cu radacina ("Marele Sef de Clan"). 
Vom utiliza reprezentarea fiu-frate, retinand, in plus, si legatura spre 
parinte. Informatia asociata nodurilor este indicele din matrice a discului 
corespunzator.
SLS va fi reprezentata ca un vector sau o lista de pointeri la nodul din arbore 
corespunzator discului respectiv. SLS va fi ordonata crescator dupa ordonata 
centrului discului.
Observa(ii
1. Relatiile intre doua discuri se stabilesc in mod uzual, in functie de razele 
lor si distanta intre centre.
2. O implementare eficienta necesita reprezentarea SLS ca un arbore binar de 
cautare echilibrat (de exemplu arbore rosu-si-negru), astfel incat operatiile 
de inserare, stergere si determinare a vecinilor sa poata fi executate eficient 
(timp logaritmic). In cazul in care si sortarea este realizata eficient 
(O(n log n)), algoritmul va fi de O( n log n) in cazul cel mai defavorabil, 
unde n este numarul de discuri.
========================================
Test 1
50 100 100
10 75 125
10 10 10
25 200 100
10 125 75
5 125 75
5 128 75
50 100 200
40 200 100
20 200 30
30 300 150
5 10 10
1 1
-------------------------
Test 2:
32000 32000 32000
32000 32000
-------------------------
Test 3:
16000 16000 16000
4000 8000 8000
4000 24000 8000
4000 8000 24000
4000 24000 24000
1000 6000 6000
1000 6000 10000
1000 10000 6000
1000 10000 10000
1000 22000 6000
1000 22000 10000
1000 26000 6000
1000 26000 10000
1000 6000 22000
1000 6000 26000
1000 10000 22000
1000 10000 26000
1000 22000 22000
1000 22000 26000
1000 26000 22000
1000 26000 26000
31999 31999
---------------------------
Test 4:
4000 8000 8000
4000 16000 16000
4000 8000 24000
4000 24000 24000
1000 6000 6000
1000 6000 10000
1000 10000 6000
1000 10000 10000
1000 22000 6000
1000 22000 10000
1000 26000 6000
1000 26000 10000
1000 6000 22000
1000 6000 26000
1000 10000 22000
1000 10000 26000
1000 22000 22000
1000 22000 26000
1000 26000 22000
1000 26000 26000
500 16000 16000
1000 16000 16000
2000 16000 16000
3000 16000 16000
4000 24000 8000
8000 16000
-------------------------------
Test 5:
10 10 10
5 100 100
50 100 100
5 100 125
5 88 120
5 112 120
2 70 85
2 130 85
10 65 90
10 135 90
20 50 50
20 150 50
29 300 30
5 220 80
20 230 85
20 400 400
20 450 450
100 400 400
255 65
-------------------------
Solutia 1 (Vingarzan Dragos-Cugir: Punctaj maxim in concurs}
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R-,S-,T-,V+,X+,Y+}
{$M 16384,0,655360}
program p1;
type maf=record
          r,x,y:longint;
         end;
var a:array[1..100] of maf;
    strat:maf;
    fin,fout:text;
    n:byte;q,w,e:longint;
    sc:boolean;test:integer;
function poz(q,w:maf):byte;
var temp:byte;
    d:real;
begin
 d:=sqrt((w.x-q.x)*(w.x-q.x)+(w.y-q.y)*(w.y-q.y));
 if d<=abs(w.r-q.r) then if q.r<w.r then temp:=1
                                    else temp:=4
                    else if d<abs(w.r+q.r) then temp:=2
                                           else temp:=3;
 poz:=temp;
end;

procedure analiza;
type subs=array[1..200,1..200] of byte;
var stop:array[1..200] of integer;
    left,t,right,cl,k,kk,sub,submax,i,j:integer;
    mtop,subb,clan:^subs;
    ok:boolean;

begin
 new(subb);new(clan);new(mtop);
 for i:=1 to n do
  for j:=1 to n do
   begin
    mtop^[i,j]:=0;
    subb^[i,j]:=0;
   end;
 for i:=1 to n do
  stop[i]:=0;

 sc:=false;
 for i:=1 to n-1 do
  begin
   for j:=i+1 to n do
    case poz(a[i],a[j]) of
     1: begin
         inc(stop[j]);
         mtop^[j,stop[j]]:=i;
        end;
     2: begin
         dispose(subb);dispose(clan);
         sc:=true;
         exit;
        end;
     4: begin
         inc(stop[i]);
         mtop^[i,stop[i]]:=j;
        end;
    end;
  end;
 write(fout,'Testul nr. ');
 writeln(fout,test);
 writeln(fout,'Pacea este stabila.');
 close(fout);
 append(fout);
 sub:=1;j:=1;
 while ok do
  begin
   ok:=false;
   for i:=1 to n do
    if stop[i]=0 then
     begin

      k:=1;kk:=1;
      while k<=n do
       begin
        if mtop^[k,kk]<>0 then if mtop^[k,kk]=i then
                               begin
                                dec(stop[k]);
                                stop[i]:=-1;
                                subb^[sub,j]:=i;
                                j:=j+1;
                                k:=n+1;
                               end
                         else begin
                               k:=k+1;
                               kk:=0;
                              end;
        kk:=kk+1;
       end;
      ok:=true;
     end;
   sub:=sub+1;
  end;
 sub:=sub-1;
 submax:=sub;
 cl:=1;clan^[cl,1]:=0;
 for i:=submax downto 1 do
  begin
   i:=submax;
   inc(clan^[cl,1]);
   clan^[cl,clan^[cl,1]+1]:=subb^[i,1];
   subb^[i,1]:=0;
   left:=2;right:=2;
   while i>0 do
    begin
     for j:=left to right do
{   k:=1;
    while mtop^[subb^[i,1],k]<>0 do
     begin
      inc(clan^[cl,1]);
      clan^[cl,clan^[cl,1]]:=mtop^[subb^[i,1]];
      inc(k);
     end;  }

      begin
       k:=1;
       while mtop^[clan^[cl,j+1],k]<>0 do
        begin
         inc(clan^[cl,1]);
         clan^[cl,clan^[cl,1]+1]:=mtop^[clan^[cl,j+1],k];
         inc(k);
         t:=1;
         while (subb^[i,t]<>0) and (subb^[i,t]<>mtop^[clan^[cl,j+1],k]) do t:=t+1;
         if subb^[i,t]<>0 then subb^[i,t]:=255;
        end;
       { de scos 255 din sirul subb }

      end;
     left:=right+1;
     right:=clan^[cl,1]+1;
     i:=i-1;
    end;
 end;
end;

begin
 test:=0;sc:=false;n:=1;
 assign(fout,'mafia.out');
 rewrite(fout);
 assign(fin,'mafia.in');
 reset(fin);
 while not(eof(fin)) do
  begin
   read(fin,a[n].r,a[n].x);
   if not(eoln(fin)) then begin
                           readln(fin,a[n].y);
                           inc(n);
                          end
                     else begin
                           strat.x:=a[n].r;
                           strat.y:=a[n].x;
                           sc:=true;
                           inc(test);
                           readln(fin);
                           if not(eof(fin)) then readln(fin);
                          end;
   if sc then begin
               sc:=false;
               n:=n-1;
               analiza;
               if sc then begin
                           write(fout,'Testul nr. ');
                           writeln(fout,test);
                           writeln(fout,'Pacea nu este stabila.');
                           writeln(fout);
                           close(fout);
                           append(fout);
                          end;
               sc:=false;
               n:=1;
              end;
  end;
 close(fin);
end.
-------------------------------
Solutia 2 (Mihai Stroe)
    Se stabileste daca exista zone de conflict. In caz contrar, se formeaza
  un graf orientat aciclic in care exista arcul (i,j) daca cercul i include
  cercul j. Se aplica algoritmul lui Floyd modificat pentru drumul maximal
  (graf aciclic) pentru a determina pe ce nivel al fiecarui clan se afla
  fiecare cerc. Pentru rezolvarea punctului al doilea se considera noua raza
  pentru fiecare cerc ce incearca sa se extinda si se verifica daca celelalte
  cercuri (cu razele initiale) se intersecteaza cu el sau au centrele
  continute in el (aceasta verificare a centrelor continute mi-ar fi adus
  intre 5 si 10 puncte; o alta greseala era ca, la formarea grafului, analizam
  perechi (i,j) de cercuri cu raza[i]>raza[j], pierzind cazurile cu cercuri cu
  raze egale (eroare greu de depistat in concurs).

type ar=array[1..255,1..255]of byte;
var fi,fo:text;
    stab:boolean;
    i,j,k,l,nrcl,nrs,m,n:longint;
    xx,yy:real;
    s:string;
    a:^ar;
    sub:array[1..255]of set of byte;
    sup:array[1..255]of byte;
    h,x,y,r:array[1..255]of real;
    ce:integer;
    di,q:real;

procedure readdata;
begin
  n:=0;
  fillchar(sub,sizeof(sub),0);
  fillchar(a^,sizeof(a^),0);
  fillchar(sup,sizeof(sup),0);
  fillchar(r,sizeof(r),0);
  fillchar(x,sizeof(x),0);
  fillchar(y,sizeof(y),0);
  stab:=true;

  inc(nrs);
  readln(fi,s);
  while(s<>'')and(s<>'*')do
    begin
      inc(n);
      i:=1;
      while s[i+1]<>' ' do inc(i);
      val(copy(s,1,i),r[n],ce);
      delete(s,1,i);
      i:=1;
      while (s[i+1]<>' ')and(i<length(s)) do inc(i);
      if s[i+1]<>' 'then i:=length(s);
      val(copy(s,1,i),x[n],ce);
      delete(s,1,i);
      if length(s)<>0 then
      val(s,y[n],ce)
      else begin
             xx:=r[n];
             yy:=x[n];
             r[n]:=0;
             x[n]:=xx;
             y[n]:=yy;
             dec(n);
           end;
      readln(fi,s);
    end;
end;

function d(i,j:longint):real;
begin
  d:=sqrt(sqr(abs(x[i]-x[j]))+sqr(abs(y[i]-y[j])));
end;

function incl(i,j:longint):boolean;
var r1,r2:real;
begin
  r1:=r[i];r2:=r[j];
  incl:=true;
  if(di<r1+r2)and(r1<di+r2)and(r2<di+r1)then incl:=false;
end;

procedure solve;
begin
  for i:=1 to n do
      for j:=1 to n do
          if i<>j then
          if r[i]>=r[j] then
          begin
            di:=d(i,j);
            if di<r[i]+r[j] then
               begin
                 if incl(i,j) then
                    begin
                      sub[i]:=sub[i]+[j];
                      sup[j]:=1;
                      a^[i,j]:=1;
                    end
                    else
                    begin
                      stab:=false;
                      exit;
                    end;
               end;
          end;

  for k:=1 to n do
      for i:=1 to n do
          if a^[i,k]<>0 then
          for j:=1 to n do
              if a^[k,j]<>0 then
                 if a^[i,k]+a^[k,j]>a^[i,j] then
                 a^[i,j]:=a^[i,k]+a^[k,j];
  for i:=1 to n do
      for j:=1 to n do
          if h[j]<a^[i,j] then h[j]:=a^[i,j];

  writeln(fo,'Testul nr. ',nrs);
  writeln(fo,'Pacea este stabila');
  nrcl:=0;
  for i:=1 to n do
      if sup[i]=0 then inc(nrcl);
  writeln(fo,'Numarul de clanuri: ',nrcl);
  nrcl:=0;
  for i:=1 to n do
      if sup[i]=0 then
      begin
        inc(nrcl);
        writeln(fo,'Clanul ',nrcl,':');
        writeln(fo,i);
        k:=1;
        l:=1;
        while l=1 do
          begin
            l:=0;
            for j:=1 to n do
                if(j in sub[i])and(h[j]=k)then
                begin
                  l:=1;
                  write(fo,j,' ');
                end;
            inc(k);
            if l=1 then writeln(fo);
          end;
      end;

  l:=0;
  for i:=1 to n do
      if d(i,n+1)<r[i]then l:=1;
  if l=1 then writeln(fo,'Reperul strategic nu este neutru ')
     else
     begin
     writeln(fo,'Reperul strategic este neutru ');
     for i:=1 to n do
         if sup[i]=0 then
            begin
              q:=r[i];
              r[i]:=d(i,n+1);
              l:=0;
              for j:=1 to n do
                  begin
                    di:=d(i,j);
                    if i<>j then
                    if (not(incl(i,j)))and(d(i,j)<r[i]+r[j]) then
                       l:=1;
                    if i<>j then
                       if not(j in sub[i])then
                          if di<r[i] then
                             l:=1;
                  end;
              if l=0 then
              write(fo,i,' ');
              r[i]:=q;

            end;


     end;



  writeln(fo);
end;

procedure tipar;
begin
  writeln(fo,'Testul nr. ',nrs);
  if stab=false then writeln(fo,'Pacea nu este stabila')
;writeln(fo);

end;

begin
  new(a);
  assign(fi,'mafia.in');
  reset(fi);
  assign(fo,'mafia.out');
  rewrite(fo);
  while not seekeof(fi)do
    begin
      readdata;
      solve;
      if stab=false then tipar;
    end;
  close(fi);
  close(fo);
end.
------------------------------
Solutia 3 {Valentin Gheorghita - Ploiesti}
program mafia;
uses crt;
type mafiot=record
             r,x,y:real;
            end;

var a:array[1..100] of mafiot;
    save,dr:array[1..100,1..100] of boolean;
    sef,sel,now,tip:array[1..100] of boolean;
    f,g:text;
    ttemp,d1,d2:real;
    n,nr,i,j,cl,k:byte;
    reper:record
           x,y:real;
          end;
    pace,gasit:boolean;

function test:boolean;
 var i:byte;
     tmp:boolean;
 begin
  tmp:=false;
  for i:=1 to n do
   if tip[i]=false then tmp:=true;
  test:=tmp;
 end;

function cercuri(k,l:byte):byte;
 var d1,d2,d,tmp:real;
 begin
  d1:=a[k].x-a[l].x;
  d2:=a[k].y-a[l].y;
  d1:=d1*d1;
  d2:=d2*d2;
  tmp:=d1+d2;
  d:=sqrt(tmp);
  tmp:=abs(a[k].r-a[l].r);
  if d<=tmp then if a[k].r>a[l].r then cercuri:=1 {primul il include pe al 2-lea}
                                  else cercuri:=2 {la 2-lea il include pe primul}
            else if d>a[k].r+a[l].r then cercuri:=3 {cercurile nu au nici o legatura}
                                    else cercuri:=4 {pacea nu exista}
 end;

begin
 clrscr;
 nr:=0;
 assign(g,'MAFIA.OUT');
 rewrite(g);
 close(g);
 assign(f,'MAFIA.IN');
 reset(f);
 while(not(seekeof(f))) do
  begin
   nr:=nr+1;
   n:=1;
   read(f,a[n].r,a[n].x);
   while(not(seekeoln(f))) do begin
                               readln(f,a[n].y);
                               inc(n);
                               read(f,a[n].r,a[n].x);
                              end;
   readln(f);
   readln(f);
   for i:=1 to n do dr[i,i]:=false;
   reper.x:=a[n].r;
   reper.y:=a[n].x;
   n:=n-1;
   pace:=true;
   for i:=1 to n-1 do
    for j:=i+1 to n do
     case cercuri(i,j) of
      1: begin
          dr[i,j]:=false;
          dr[j,i]:=true;
         end;
      2: begin
          dr[i,j]:=true;
          dr[j,i]:=false;
         end;
      3: begin
          dr[i,j]:=false;
          dr[j,i]:=false;
         end;
      4: pace:=false;
     end;
   for i:=1 to n do
    for j:=1 to n do
     save[i,j]:=dr[i,j];
   for i:=1 to n do sef[i]:=false;
   if not(pace)
    then begin
          append(g);
          writeln(g,'Testul nr. ',nr);
          writeln(g,'Pacea nu este stabilita.');
          writeln(g);
          close(g);
         end
    else begin
          append(g);
          writeln(g,'Testul nr. ',nr);
          writeln(g,'Pacea este stabilita.');
          cl:=0;
          for i:=1 to n do
           begin
            gasit:=false;
            for j:=1 to n do gasit:=(gasit)or(dr[i,j]);
            if not(gasit) then begin
                                inc(cl);
                                sef[i]:=true;
                               end;
           end;
          writeln(g,'Numarul de clanuri: ',cl);
          cl:=0;
          for i:=1 to n do tip[i]:=false;
          while(test) do
           begin
            for i:=1 to n do sel[i]:=false;
            j:=0;
            repeat
             j:=j+1;
             gasit:=false;
             for i:=1 to n do gasit:=(gasit)or(dr[j,i]);
            until ((not(gasit)) and (not(tip[j])));
            inc(cl);
            writeln(g,'Clanul ',cl,':');
            writeln(g,j);
            tip[j]:=true;
            for i:=1 to n do
             if dr[i,j] then begin
                              sel[i]:=true;
                              dr[i,j]:=false;
                             end;
             for i:=1 to n do
              if sel[i] then begin
                              gasit:=false;
                              for j:=1 to n do
                               if dr[i,j] then gasit:=true;
                              if gasit then sel[i]:=false;
                             end;
            gasit:=false;
            for i:=1 to n do gasit:=(gasit)or(sel[i]);
            if gasit then
            repeat
             for i:=1 to n do now[i]:=false;
             for i:=1 to n do
              if sel[i] then begin
                              write(g,i,' ');
                              tip[i]:=true;
                              for j:=1 to n do
                               if dr[j,i] then begin
                                                now[j]:=true;
                                                dr[j,i]:=false;
                                               end;
                             end;
             writeln(g);
             gasit:=true;
             for i:=1 to n do
              if now[i] then begin
                              gasit:=false;
                              for j:=1 to n do
                               if dr[i,j] then gasit:=true;
                              if gasit then now[i]:=false;
                             end;
             for i:=1 to n do
              gasit:=(gasit)and(not(now[i]));
             for i:=1 to n do sel[i]:=now[i];
            until gasit;
           end;
         n:=n;
         a[n+1].r:=0;
         a[n+1].x:=reper.x;
         a[n+1].y:=reper.y;
         gasit:=false;
         for i:=1 to n do
          if cercuri(i,n+1)<>3 then gasit:=true;
         if gasit then writeln(g,'Reperul strategic nu este neutru.')
                  else begin
                        writeln(g,'Reperul strategic este neutru.');
                        for k:=1 to n do
                         if sef[k] then begin
                                         ttemp:=a[k].r;
                                         d1:=reper.x-a[k].x;
                                         d2:=reper.y-a[k].y;
                                         d1:=d1*d1;
                                         d2:=d2*d2;
                                         d1:=d1+d2;
                                         a[k].r:=sqrt(d1);
                                         for i:=1 to n do dr[i,i]:=false;
                                         for i:=1 to n-1 do
                                          for j:=i+1 to n do
                                           case cercuri(i,j) of
                                            1: begin
                                                dr[i,j]:=false;
                                                dr[j,i]:=true;
                                               end;
                                            2: begin
                                                dr[i,j]:=true;
                                                dr[j,i]:=false;
                                               end;
                                            3: begin
                                                dr[i,j]:=false;
                                                dr[j,i]:=false;
                                               end;
                                           end;
                                         gasit:=true;
                                         for i:=1 to n do
                                          for j:=1 to n do
                                           if dr[i,j]<>save[i,j] then gasit:=false;
                                         if gasit then write(g,k,' ');
                                         a[k].r:=ttemp;
                                        end;
                        writeln(g);writeln(g);
                       end;

         close(g);
        end;
  end;
 close(f);
end.
--------------------------------

